import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车模块
export default {
  namespaced: true,
  state () {
    return {
      cartList: []
    }
  },
  mutations: {
    setCartList (state, cartList) {
      state.cartList = cartList
    }
  },
  getters: {
    // 商品总数
    allCount (state) {
      return state.cartList.reduce((a, c) => a + c.count, 0)
    },
    // 总钱数 商品数量 * 商品单价
    allPrice (state) {
      return state.cartList.reduce((a, c) => a + c.count * c.price, 0)
    },
    isAll (state) {
      // cartList中的所有项 selected为true isAll才等于true
      return state.cartList.every(item => item.selected === true)
    },
    // 已选择几件 selected 如果为true就是选中的项
    seletedCount (state) {
      return state.cartList.filter(item => item.selected).reduce((a, c) => a + c.count, 0)
    },
    // 已选商品合计
    seletedPrice (state) {
      // 所有的列表中seleted为true的项过滤出来 然后把price * count 叠加
      return state.cartList.filter(item => item.selected)
        .reduce((a, c) => a + c.count * c.price, 0)
    }
  },
  // 异步
  actions: {

    async asyncRefreshCart (ctx) {
      // 2. 重新拉取购物车更新本地数据
      const cartListRes = await findCartList()
      ctx.commit('setList', cartListRes.data.result)
    },
    async asyncSetCartList (ctx, { skuId, count }) {
      // 1. 调用加入购物车接口 inserCart
      await insertCart({ skuId, count })
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车
    async asyncDelCart (ctx, ids) {
      // 1. 调用删除接口
      await deleteCart(ids)
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    },
    // 单选
    async asyncSingleCheck (ctx, goods) {
      // 1. 调用单选接口
      await updateCart(goods)
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    },
    // 多选
    async asyncAllCheck (ctx, selected) {
      await checkAllCart({
        selected,
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    },
    // 数量修改
    async asyncChangeCount (ctx, { good, count }) {
      // 1. 调用更新数量接口
      await updateCart({
        skuId: good.skuId,
        selected: good.selected,
        count
      })
      // 2. 拉取购物车列表
      const res = await findCartList()
      // 3. 更新购物车列表
      ctx.commit('setCartList', res.result)
    }
  }
}
